//
//  SenseArAudienceMaterialRender.h
//  SenseAr
//

#import <Foundation/Foundation.h>
#import "SenseArMaterialRender.h"
#import "SenseArNsAd.h"

/**
 渲染素材回调
 */
typedef void(^SenseArAudienceMaterialRenderCallBack)(SenseArNsAd *nSecAd);

@interface SenseArAudienceMaterialRender : NSObject

/**
 直播前贴片广告开始展示 , 在渲染队列回调 , 不宜做耗时操作
 */
@property (nonatomic, copy) SenseArAudienceMaterialRenderCallBack renderBegin;

/**
 直播前贴片广告结束展示 , 在渲染队列回调 , 不宜做耗时操作
 */
@property (nonatomic, copy) SenseArAudienceMaterialRenderCallBack renderEnd;


/**
 创建渲染模块
 
 @param strModelPath 模型路径
 @param iConfig      开启功能的配置
 @param context      渲染使用的 OpenGL 环境
 
 @return 渲染模块实例
 */
+ (SenseArAudienceMaterialRender *)instanceWithModelPath:(NSString *)strModelPath
                                                  config:(uint32_t)iConfig
                                                 context:(EAGLContext *)context;


/**
 初始化 OpenGL 资源
 */
- (void)initGLResource;


/**
 释放 OpenGL 资源
 */
- (void)releaseGLResource;


/**
 设置素材图像所占用的最大内存 (MB) , 默认 150 MB , 素材过大时 , 循环加载 , 降低内存; 贴纸较小时 , 全部加载 , 降低 CPU
 
 @param fSize 设置的内存大小
 @return 是否设置成功 成功 YES , 失败 NO
 */
- (BOOL)setMaxImageMemory:(float)fSize;



/**
 设置图像大小
 
 @param iWidth  图像宽度
 @param iHeight 图像高度
 @param iStride 图像跨度
 */
- (void)setFrameWidth:(int)iWidth height:(int)iHeight stride:(int)iStride;


/**
 获取图像绘制信息
 
 @param pFrameInfo      返回的图像绘制信息 , 需要用户分配内存 , 建议分配 10KB .
 @param pLength         返回的信息长度
 @param iPixelFormatIn  输入图像格式
 @param pImageIn        输入图像
 @param iRotateType     图像需要旋转的角度
 @param bNeedsMirroring 图像是否需要镜像
 @return 渲染模块的状态
 */
- (SenseArRenderStatus)generateFrameInfo:(Byte *)pFrameInfo
                         frameInfoLength:(int *)pLength
                       withPixelFormatIn:(SenseArPixelFormat)iPixelFormatIn
                                 imageIn:(Byte *)pImageIn
                              rotateType:(SenseArRotateType)iRotateType
                          needsMirroring:(BOOL)bNeedsMirroring;


/**
 渲染直播前贴片广告并根据需求可以输出渲染后的图像
 
 @param pFrameInfo    渲染素材需要的绘制信息
 @param iTextureIdIn  输入 textureID
 @param iTextureIdOut 输出 textureID
 @param iPixelFormat  输出的图像格式
 @param pImageOut     输出的图像 , 传 NULL 表示不输出图像 , 性能会更好一些 .
 
 @return 渲染的状态
 */
- (SenseArRenderStatus)renderMaterialWithFrameInfo:(Byte *)pFrameInfo
                                   frameInfoLength:(int)iLength
                                         textureIn:(GLuint)iTextureIdIn
                                        textureOut:(GLuint)iTextureIdOut
                                       pixelFormat:(SenseArPixelFormat)iPixelFormat
                                          imageOut:(Byte *)pImageOut;

/**
 * 强制停止直播前贴片广告. 例如显示礼物时停止展示直播前贴片广告或不期望展示直播前贴片广告 .
 */
- (void)forceStopNsAd;



/**
 检查是否触发热链接点击 , 如果返回值不为空 , 则触发热链接点击 .
 
 @param clickPosition           点击视图的点
 @param imageSize               图像的尺寸
 @param previewSize             视图的尺寸
 @param previewOriginPosition   视图左上角相对于屏幕左上角的坐标
 @return 点击结果 如果触发热链接点击该值不为空 , 返回值可用于调用 reportAdClickedWithUserID 上报 .
 */
- (SenseArHotLinkClickResult *)checkHotLinkWithClickedPosition:(CGPoint)clickPosition
                                                     imageSize:(CGSize)imageSize
                                                   previewSize:(CGSize)previewSize
                                         previewOriginPosition:(CGPoint)previewOriginPosition;


/**
 点击热链接跳转上报
 
 @param strUserID strUserID 当前用户ID
 @param strBroadcasterID 主播 ID (可选), 如果当前用户为观众端 , 该参数代表所观看的主播 ID , 如果为其他 Client 类型没有可以传 nil .
 @param clickResult checkHotLinkWithClickedPosition 返回的点击结果
 */
- (void)reportAdClickedWithUserID:(NSString *)strUserID
                    broadcasterID:(NSString *)strBroadcasterID
                      clickResult:(SenseArHotLinkClickResult *)clickResult;



/**
 是否开启前贴片人脸检测条件 , 开启时仅当场景中前N帧检测到人脸才展示前贴广告 . 默认为关闭

 @param bEnable 是否开启 , YES : 开启 , NO : 不开启 , 默认 NO .
 */
-(void)enableFaceSceneCheckForNsAd:(BOOL)bEnable;



@end
